package cn.edu.flying_birds;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author Li.Ding.yin
 * @create 2021年06月23日16:51-星期三
 * @role 游戏面板类：画小鸟、画背景、柱子、地面、积分系统
 */
public class BirdPanel extends JPanel {

    //定义存放背景图片的变量
    private BufferedImage bj;
    //定义地面类变量
    private Ground ground;
    //定义定时器变量
    private Timer timer;
    //定义第一根柱子
    private Column column1;
    //定义第一根柱子
    private Column column2;
    //定义小鸟对象
    private Bird bird;
    //定义游戏运行状态 false为未运行，true为运行
    private boolean status;
    //定义游戏是否介素状态false为未结束，true为结束
    private boolean gameVoer;
    //定义分数
    private int score;

    //无参构造
    public BirdPanel() {
        try {
            init();
        } catch (IOException e) {
            System.out.println("初始化面板失败！");
            e.printStackTrace();
        }
        //添加鼠标监听
        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //System.out.println("鼠标点击了！");
                //判断游戏运行状态
                if (status) {//游戏运行
                    //判断游戏是否结束
                    if (gameVoer) {
                        //游戏结束
                        //初始化游戏，重新开始游戏
                        timer.cancel();//关闭定时器
                        try {
                            init();
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                        // 重画游戏界面
                        repaint();
                    } else {
                        //判断小鸟是否飞到顶部
                        if (bird.y > 0) {
                            //调用小鸟往上飞的方法
                            bird.moveUp();
                        }
                    }
                } else {//游戏未运行
                    //将游戏状态修改为true，同时调用run方法
                    run();
                    status = true;
                }
            }
        };
        this.addMouseListener(mouseAdapter);
    }

    //初始化面板
    private void init() throws IOException {
        //设置背景颜色
        setBackground(Color.black);
        //读取背景图片
        bj = ImgUtils.getImg("../img/bg.png");
        //初始化地面变量
        ground = new Ground();
        //初始化第一根柱子变量
        column1 = new Column(1);
        //初始化第二根柱子变量
        column2 = new Column(2);
        //初始化小鸟
        bird = new Bird();
        //初始化游戏运行状态
        status = false;
        //初始化游戏状态
        gameVoer = false;
        score = 0;

    }

    /**
     * 执行方法，让小鸟飞起来，地面动起来，柱子动起来
     */
    public void run() {
        //初始化定时器对象
        timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                //判断游戏是否结束，如果游戏结束，则不执行以下代码，否则执行
                if (!gameVoer && status) {
                    //调用地面移动的方法
                    ground.move();
                    //调用柱子移动的方法
                    column1.move();
                    column2.move();
                    //调用小鸟飞
                    bird.flying();
                    //判断第一根柱子是否与小鸟相撞
                    boolean b1 = bird.columnCrash(column1);
                    //判断第二根柱子是否与小鸟相撞
                    boolean b2 = bird.columnCrash(column2);

                    //判断小鸟是否与地面相撞
                    if (bird.groundCrash() || b1 || b2) {
                        //与地面相撞,修改游戏状态
                        gameVoer = true;
                    } else {
                        //调用小鸟往下掉的方法
                        bird.moveDown();
                    }
                    //计分
                    if (bird.x == (column1.x + column1.width) || bird.x == (column2.x + column2.width)) {
                        score++;
                    }
                }
                //刷新游戏界面
                repaint();
            }
        };
        //开启定时器
        timer.schedule(task, 0, 30);//30s,每隔30毫秒执行一次
    }


    /**
     * 画内容、画对象
     *
     * @param g g就是画笔
     */
    @Override
    public void paint(Graphics g) {
        //绘制背景图片
        g.drawImage(bj, 0, 0, null);
        //绘制柱子图片
        g.drawImage(column1.img, column1.x, column1.y, column1.width, column1.height, null);
        g.drawImage(column2.img, column2.x, column2.y, column2.width, column2.height, null);
        //绘制小鸟图片
        g.drawImage(bird.img, bird.x, bird.y, bird.width, bird.height, null);

        try {
            //绘制游戏初始界面
            if (!status) {
                g.drawImage(ImgUtils.getImg("../img/start.png"), 0, 0, null);
            }
            //绘制游戏结束界面
            if (gameVoer) {
                g.drawImage(ImgUtils.getImg("../img/gameover.png"), 0, 0, null);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //绘制分数
        g.setColor(Color.white);//设置画笔颜色
        g.setFont(new Font("黑体", Font.BOLD, 20));//设置字体颜色
        g.drawString("分数:" + score, 15, 30);
        //绘制地面图片
        g.drawImage(ground.img, ground.x, ground.y, null);
    }
}
